﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Studio7i.Dominio;
using Studio7i.Persistencia;

namespace Studio7i.Negocio
{
    public class AdministracionServiceImpl : IAdministracionService
    {
        #region Dependencias
        ILocalDAO localDAO = null;
        ISalaDAO salaDAO = null;
        IClienteDAO clienteDAO = null;
        IInstrumentoDAO instrumentoDAO = null;
        IServicioDAO servicioDAO = null;
        IReserva reservaDAO = null;
        #endregion

        #region Operaciones de negocio para la entidad Sala

        public Sala InscribirSala(String nombre, int CodLocal, int capacidad, string caracteristicas)
        {
            // Excepción si falta algun dato requerido
            if (nombre == null || CodLocal == 0 || capacidad == 0 || caracteristicas == null)
                throw new DatosInsuficientesException("Faltan datos para crear la sala");
            //Excepción si ya se registró la misma sala (por nombre y código de local)
            Local localExistente = localDAO.Obtener(CodLocal);
            ICollection<Sala> salasEncontradas = salaDAO.ListarXBusqueda(null, nombre, null, null, null, localExistente);
            if (salasEncontradas.Count > 0)
                throw new EntidadRepetidaException("La sala ya existe");
            //Creación de la sala
            Sala salaACrear = new Sala();
            salaACrear.Nombre = nombre;
            salaACrear.Local = localExistente;
            salaACrear.Capacidad = capacidad;
            salaACrear.Caracteristicas = caracteristicas;
            return salaDAO.Crear(salaACrear);
        }
        #endregion

        #region Métodos de soporte para entidad Sala
        public Sala CrearSala(Sala salaACrear)
        {
            return salaDAO.Crear(salaACrear);
        }
        public Sala ObtenerSala(int codigo)
        {
            return salaDAO.Obtener(codigo);
        }
        public Sala ModificarSala(Sala salaAModificar)
        {
            return salaDAO.Modificar(salaAModificar);
        }
        //public ICollection<Sala> ListarSalas()
        //{
        //    return salaDAO.ListarTodos();
        //}
        public ICollection<Sala> ListarSalas(int? CodSala, string Nombre, int? CodLocal, int? Capacidad, string Caracteristicas)
        {
            Local localExistente = null;
            if (CodLocal != null && CodLocal != 0)
                localExistente = localDAO.Obtener(CodLocal.Value);
            return salaDAO.ListarXBusqueda(null, Nombre, Capacidad, Caracteristicas, null, localExistente);
        }
        //public ICollection<Sala> ListarSalasXNombre(string nombre)
        //{
        //    return salaDAO.ListarXNombre(nombre);
        //}
        public void EliminarSala(Sala salaAEliminar) 
        {
            salaDAO.Eliminar(salaAEliminar);
        }
        #endregion

        #region Métodos de soporte para entidad Local
        public Local CrearLocal(Local localACrear)
        {
            return localDAO.Crear(localACrear);
        }
        public Local ObtenerLocal(int codigo)
        {
            return localDAO.Obtener(codigo);
        }
        public Local ModificarLocal(Local localAModificar)
        {
            return localDAO.Modificar(localAModificar);
        }
        public ICollection<Local> ListarLocales()
        {
            return localDAO.ListarTodos();
        }
        public ICollection<Local> ListarLocalesXNombre(string nombre)
        {
            return localDAO.ListarXNombre(nombre);
        }
        public void EliminarLocal(Local localAEliminar)
        {
            localDAO.Eliminar(localAEliminar);
        }
        #endregion

        #region Métodos de soporte para entidad Sala
       
        #endregion

        #region Métodos de soporte para la entidad Instrumento
        public ICollection<Instrumento> ListarInstrumentos(int? CodInst, string Tipo, string Marca, string Modelo, DateTime FechFabricacion, string Caracteristicas, int? CostoHora, bool Estado, int? CodSala)
        {
            Sala salaExistente = null;
            if (CodSala != null || CodSala != 0)
                salaExistente = salaDAO.Obtener(CodSala.Value);
            return instrumentoDAO.ListarXBusqueda(null, Tipo, Marca, Modelo, FechFabricacion, null, CostoHora, Estado, salaExistente);
        }

        #endregion


        #region Métodos de soporte para entidad Servicio
        public Servicio CrearServicio(Servicio servicioACrear)
        {
            return servicioDAO.Crear(servicioACrear);
        }
        public Servicio ObtenerServicio(int codigo)
        {
            return servicioDAO.Obtener(codigo);
        }
        public Servicio ModificarServicio(Servicio servicioAModificar)
        {
            return servicioDAO.Modificar(servicioAModificar);
        }
        public ICollection<Servicio> ListarServicios()
        {
            return servicioDAO.ListarTodos();
        }
        public ICollection<Servicio> ListarServiciosXDescripcion(string descripcion)
        {
            return servicioDAO.ListarXDescripcion(descripcion);
        }
        public void EliminarServicio(Servicio servicioAEliminar) { }
        #endregion
        
        //metodo para registrar los instrumentos cuando no haya un dato incompleto

        #region Operaciones del Negocio para la entidad Instrumento
        public Instrumento RegistrarInstrumento(String tipo, String marca, String modelo, DateTime FechFabricacion, String caracteristicas, int CostoHora, bool Estado)
        {
            //validamos que ningún dato venga nulo
            if (tipo == null || marca == null || modelo == null || FechFabricacion == null || caracteristicas == null || CostoHora == 0 || Estado == true)
            {
                throw new DatosInsuficientesException("Faltan datos para crear un instrumento");
            }
            //creamos el instrumento
            Instrumento instrumentoACrear = new Instrumento();
            instrumentoACrear.Tipo = tipo;
            instrumentoACrear.Marca = marca;
            instrumentoACrear.Modelo = modelo;
            instrumentoACrear.FechFabricacion = FechFabricacion;
            instrumentoACrear.Caracteristicas = caracteristicas;
            instrumentoACrear.CostoHora = CostoHora;
            instrumentoACrear.Estado = Estado;
            return instrumentoDAO.Crear(instrumentoACrear);
        }
        #endregion

        #region Operaciones del Negocio para la entidad Cliente
        public Cliente RegistrarCliente(int coduser, string nombUsuario, string clave, string dni, string nombres, string apellidos, string email, DateTime fechaNac)
        {


            //validamos que ningún dato venga nulo
            if (coduser == null || nombUsuario == null || clave == null || dni == null || nombres == null || apellidos == null || email == null || fechaNac == null)
            {
                throw new DatosInsuficientesException("Faltan datos para crear un cliente");
            }
            //creamos el cliente
            Cliente clienteACrear = new Cliente();
            clienteACrear.CodUser = coduser;
            clienteACrear.NombreUsuario = nombUsuario;
            clienteACrear.Clave = clave;
            clienteACrear.DNI = dni;
            clienteACrear.Nombres = nombres;
            clienteACrear.Apellidos = apellidos;
            clienteACrear.Email = email;
            clienteACrear.FechaNac = fechaNac;
            return clienteDAO.Crear(clienteACrear);

        }

        

        #endregion


        #region Operaciones del Negocio para la entidad Servicio
        public Servicio RegistrarServicio(int codserv, string Descripcion, int costoHora)
        {


            //validamos que ningún dato venga nulo
            if (codserv == null || Descripcion == null || costoHora == null )
            {
                throw new DatosInsuficientesException("Faltan datos para crear un servicio");
            }
            //creamos el servicio
            Servicio servicioACrear = new Servicio();
            servicioACrear.CodServ = codserv;
            servicioACrear.Descripcion = Descripcion;
            servicioACrear.CostoHora = costoHora;
            return servicioDAO.Crear(servicioACrear);

        }
        #endregion
    }
}
